package com.serviportales.serviquality.calificacion.beans;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.log4j.Logger;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.rits.cloning.Cloner;
import com.serviportales.serviportales.beans.Contexto;
import com.serviportales.serviportales.model.GenericNodeUserObject;
import com.serviportales.serviportales.model.GenericTreeModel;
import com.serviportales.serviportales.utils.SessionUtils;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.managers.MgrCalProyectoNodo;
import com.serviportales.serviquality.model.CalProyectoNodo;
import com.serviportales.serviquality.model.ProyectoUser;

@ManagedBean(name = "fcTreeProyecto", eager = true)
@ViewScoped
public class FCTreeProyecto implements Serializable {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(getClass());

	private ProyectoUser proyectoUser;
	private CalProyectoNodo calProyectoNodoSelected;

	// Tree
	private DefaultMutableTreeNode dmTreeNodeSelected;
	private GenericTreeModel<CalProyectoNodo> proyectoTreeModel;
	private boolean visibleCalificacionForm;

	public ProyectoUser getProyectoUser() {
		return proyectoUser;
	}

	public void setProyectoUser(ProyectoUser proyectoUser) {
		this.proyectoUser = proyectoUser;

		visibleCalificacionForm = false;
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrCalProyectoNodo mgrCalProyectoNodo = ((MgrCalProyectoNodo) Contexto.getApplicationContext().getBean("mgrCalProyectoNodo"));
			proyectoTreeModel = mgrCalProyectoNodo.createTree(proyectoUser);
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}

	public DefaultMutableTreeNode getDmTreeNodeSelected() {
		return dmTreeNodeSelected;
	}

	public void setDmTreeNodeSelected(DefaultMutableTreeNode dmTreeNodeSelected) {
		this.dmTreeNodeSelected = dmTreeNodeSelected;
	}

	public CalProyectoNodo getCalProyectoNodoSelected() {
		return calProyectoNodoSelected;
	}

	public void setCalProyectoNodoSelected(CalProyectoNodo calProyectoNodoSelected) {
		this.calProyectoNodoSelected = calProyectoNodoSelected;
	}

	public GenericTreeModel<CalProyectoNodo> getProyectoTreeModel() {
		return proyectoTreeModel;
	}

	public void setProyectoTreeModel(GenericTreeModel<CalProyectoNodo> proyectoTreeModel) {
		this.proyectoTreeModel = proyectoTreeModel;
	}

	public boolean isVisibleCalificacionForm() {
		return visibleCalificacionForm;
	}

	public void setVisibleCalificacionForm(boolean visibleCalificacionForm) {
		this.visibleCalificacionForm = visibleCalificacionForm;
	}

	@PostConstruct
	public void init() {
		visibleCalificacionForm = false;
		calProyectoNodoSelected = new CalProyectoNodo();

		proyectoTreeModel = new GenericTreeModel<CalProyectoNodo>();
		proyectoTreeModel.setRootNode("", new CalProyectoNodo());
		dmTreeNodeSelected = (DefaultMutableTreeNode) proyectoTreeModel.getRoot();
	}

	@SuppressWarnings("unchecked")
	public void nodeSelected(ActionEvent event) {
		Cloner cloner = new Cloner();
		FacesContext context = FacesContext.getCurrentInstance();
		String idNodo = SessionUtils.getRequesParameter(context, "idNodo");
		dmTreeNodeSelected = proyectoTreeModel.findNode(idNodo);
		GenericNodeUserObject<CalProyectoNodo> genericNodeUserObject = (GenericNodeUserObject<CalProyectoNodo>) dmTreeNodeSelected.getUserObject();
		CalProyectoNodo calProyectoNodoTree = cloner.deepClone((genericNodeUserObject).getValue());
		
		calProyectoNodoSelected = cloner.deepClone(calProyectoNodoTree);
		if (!dmTreeNodeSelected.equals(proyectoTreeModel.getRoot()) && genericNodeUserObject.isLeaf()) {
			visibleCalificacionForm = true;
		} else {
			visibleCalificacionForm = false;			
		}		
	}

	@SuppressWarnings("unchecked")
	public void grabarCalProyectoNodo() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrCalProyectoNodo mgrCalProyectoNodo = ((MgrCalProyectoNodo) Contexto.getApplicationContext().getBean("mgrCalProyectoNodo"));
			mgrCalProyectoNodo.grabarCalProyectoNodo(calProyectoNodoSelected);
			FacesMessageUtil.info(context, messageSource.getMessage(ServiqualityException.GRABAR_EXITO, null, LocaleContextHolder.getLocale()));
			
			Cloner cloner = new Cloner();
			CalProyectoNodo calProyectoNodoTree = cloner.deepClone(calProyectoNodoSelected);
			GenericNodeUserObject<CalProyectoNodo> genericNodeUserObject = (GenericNodeUserObject<CalProyectoNodo>) dmTreeNodeSelected.getUserObject();
			genericNodeUserObject.setValue(calProyectoNodoTree);
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}catch (Exception exception) {
			FacesMessageUtil.error(context, messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(exception.getMessage(), exception);
		}
	}

	public void refreshProyecto() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrCalProyectoNodo mgrCalProyectoNodo = ((MgrCalProyectoNodo) Contexto.getApplicationContext().getBean("mgrCalProyectoNodo"));
			proyectoTreeModel = mgrCalProyectoNodo.createTree(proyectoUser);
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}
}